library(dplyr)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(readr)
library(ggplot2)
histologies_df <- read_tsv(file.path("..", "..", "data", 
                                     "pbta-histologies.tsv"))
Parsed with column specification:
cols(
  .default = col_character(),
  OS_days = col_double(),
  age_last_update_days = col_double(),
  normal_fraction = col_double(),
  tumor_fraction = col_double(),
  tumor_ploidy = col_double(),
  molecular_subtype = col_logical()
)
See spec(...) for full column specifications.
221 parsing failures.
 row               col           expected actual                              file
2606 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
2607 molecular_subtype 1/0/T/F/TRUE/FALSE Group4 '../../data/pbta-histologies.tsv'
2608 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
2609 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
2610 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
.... ................. .................. ...... .................................
See problems(...) for more details.
chordoma_samples <- histologies_df %>%
  filter(short_histology == "Chordoma") %>% 
  pull(Kids_First_Biospecimen_ID)
# TODO: update to use consensus file and likely a more permissive version of 
# the focal-cn-file-preparation annotation step
# Here, we're using an older version of the annotated files that used exons
focal_cn_df <- read_tsv("https://github.com/AlexsLemonade/OpenPBTA-analysis/raw/fa214291713575be7fd20c92374b268870f4173f/analyses/focal-cn-file-preparation/results/cnvkit_annotated_cn_autosomes.tsv.gz")
Parsed with column specification:
cols(
  biospecimen_id = col_character(),
  status = col_character(),
  copy_number = col_double(),
  ploidy = col_double(),
  ensembl = col_character(),
  gene_symbol = col_character(),
  cytoband = col_character()
)
chordoma_loss <- focal_cn_df %>% 
  filter(biospecimen_id %in% chordoma_samples, gene_symbol == "SMARCB1")

chordoma_loss 
#we need to include the sample_id field from pbta-histologies.tsv in the final table (field will allow #us to map between RNA-seq (e.g., SMARCB1 expression values) and WGS data (e.g., SMARCB1 focal copy #number status) from the same event for a given individual).
#To get the SMARCB1 jitter plot in the photo here #250 (comment), you will first need to read in the #collapsed expression data

expression_data <- read_rds(file.path("..", "..", "data", "pbta-gene-expression-rsem-fpkm-collapsed.stranded.rds"))
expression_data
chordoma_id_df <- histologies_df %>% 
  # only rows with chordoma samples
  filter(short_histology == "Chordoma") %>%
  # select only these columns that we'll need later
  select(Kids_First_Biospecimen_ID, sample_id, Kids_First_Participant_ID,
         experimental_strategy)
chordoma_id_df
copy_neutral_df <- chordoma_id_df %>% 
  # the copy events can only be taken from WGS data not RNA-seq data
  # we also only want biospecimens where a loss was not recorded to avoid duplicates
  filter(experimental_strategy == "WGS",
         !(Kids_First_Biospecimen_ID %in% chordoma_loss$biospecimen_id)) %>%
  # if there's no loss, let's assume status is copy neutral
  mutate(status = "neutral") %>%
  # let's get the columns to match chordoma_loss
  rename(biospecimen_id = Kids_First_Biospecimen_ID) %>%
  select(biospecimen_id, status)
copy_neutral_df
chordoma_copy <- chordoma_loss %>% 
  #join the losses with the neutrals to get a new data frame
  select(biospecimen_id, status) %>%
  bind_rows(copy_neutral_df)
chordoma_copy

Need to get the sample_id that corresponds to biospecimen_id into chordoma_copy so we can match WGS and RNA-seq biospecimens from the same event/sample:

chordoma_copy <- chordoma_copy %>%
  # get only the Kids_First_Biospecimen_ID, sample_id columns from our identifier data.frame
  # then use biospecimen IDs to add the sample_id info
  inner_join(select(chordoma_id_df,
                    Kids_First_Biospecimen_ID,
                    sample_id),
             by = c("biospecimen_id" = "Kids_First_Biospecimen_ID"))
chordoma_copy

look at SMARCB1 expression values only in chordoma

# get the row that contains the SMARCB1 values
# gene symbols are rownames
smarcb1_expression <- expression_data[which(rownames(expression_data) == "SMARCB1"), ]

# now only the columns correspond to chordoma samples
smarcb1_expression <- smarcb1_expression[, which(colnames(expression_data) %in% chordoma_samples) ]
smarcb1_expression

The smarcb1_expression is a not a friendly form ^^; Transposing needed:

# transpose such that samples are rows
smarcb1_expression <- t(smarcb1_expression) %>%
  # make a data.frame
  as.data.frame() %>%
  # we want the rownames that are biospecimen identifers as their own column called Kids_First_Biospecimen_ID
  tibble::rownames_to_column("Kids_First_Biospecimen_ID") %>%
  # give SMARCB1 column a slightly better column name
  rename(SMARCB1_expression = SMARCB1)
smarcb1_expression

This also needs sample_id to add it in:

smarcb1_expression <- smarcb1_expression %>%
  inner_join(select(chordoma_id_df,
                    Kids_First_Biospecimen_ID,
                    sample_id),
             by = "Kids_First_Biospecimen_ID")
smarcb1_expression
chordoma_smarcb1_df <- smarcb1_expression %>%
  # any missing samples will get filled with NA when using a full join
  full_join(chordoma_copy, by = "sample_id")
chordoma_smarcb1_df
# this step adds in the participant identifier (sample_id to match between the two data.frame)
chordoma_smarcb1_df <- chordoma_smarcb1_df %>%
  inner_join(distinct(select(chordoma_id_df, 
                             sample_id, 
                             Kids_First_Participant_ID)),
             by = "sample_id")

# combining the two biospecimen identifiers to a single column (all biospecimen IDs for a sampl separated by a comma)
chordoma_smarcb1_df <- chordoma_smarcb1_df %>%
  mutate(Kids_First_Biospecimen_ID = if_else(
    # one sample is missing WGS data, so if that's true only include biospecimen ID from RNA-seq
    is.na(biospecimen_id),
    Kids_First_Biospecimen_ID,
    paste(Kids_First_Biospecimen_ID, biospecimen_id, sep = ", ")
  ))
chordoma_smarcb1_df
chordoma_smarcb1_df <- chordoma_smarcb1_df %>%
  select(Kids_First_Participant_ID, 
         Kids_First_Biospecimen_ID, 
         sample_id,
         status,
         SMARCB1_expression) %>%
  # 'status' is replaced a more descriptive name
  rename(focal_SMARCB1_status = status)
chordoma_smarcb1_df
# this specifies that this is the data we want to plot
chordoma_smarcb1_df %>%
  # drop the sample that doesn't have WGS data
  tidyr::drop_na() %>%
  # this step specifies what should go on the x- and y-axes
  ggplot(aes(x = focal_SMARCB1_status,
             y = SMARCB1_expression)) +
  # we want a jitter plot where the points aren't too far 
  # apart that's what width does
  geom_jitter(width = 0.1) +
  # this is plotting the median as a blue diamond
  stat_summary(fun.y = "median", 
               geom = "point", 
               size = 3, 
               color = "blue", 
               shape = 18)

Brachyury / T / TBXT protein expression

LS0tCnRpdGxlOiAiU3VidHlwaW5nIGNob3Jkb21hIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBNYXRldXN6IEtvcHR5cmEgCmRhdGU6IDIwMTkxMTIxCi0tLQoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZ2dwbG90MikKYGBgCgpgYGB7cn0KaGlzdG9sb2dpZXNfZGYgPC0gcmVhZF90c3YoZmlsZS5wYXRoKCIuLiIsICIuLiIsICJkYXRhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGJ0YS1oaXN0b2xvZ2llcy50c3YiKSkKYGBgCmBgYHtyfQpjaG9yZG9tYV9zYW1wbGVzIDwtIGhpc3RvbG9naWVzX2RmICU+JQogIGZpbHRlcihzaG9ydF9oaXN0b2xvZ3kgPT0gIkNob3Jkb21hIikgJT4lIAogIHB1bGwoS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCkKYGBgCgpgYGB7cn0KIyBUT0RPOiB1cGRhdGUgdG8gdXNlIGNvbnNlbnN1cyBmaWxlIGFuZCBsaWtlbHkgYSBtb3JlIHBlcm1pc3NpdmUgdmVyc2lvbiBvZiAKIyB0aGUgZm9jYWwtY24tZmlsZS1wcmVwYXJhdGlvbiBhbm5vdGF0aW9uIHN0ZXAKIyBIZXJlLCB3ZSdyZSB1c2luZyBhbiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBhbm5vdGF0ZWQgZmlsZXMgdGhhdCB1c2VkIGV4b25zCmZvY2FsX2NuX2RmIDwtIHJlYWRfdHN2KCJodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9yYXcvZmEyMTQyOTE3MTM1NzViZTdmZDIwYzkyMzc0YjI2ODg3MGY0MTczZi9hbmFseXNlcy9mb2NhbC1jbi1maWxlLXByZXBhcmF0aW9uL3Jlc3VsdHMvY252a2l0X2Fubm90YXRlZF9jbl9hdXRvc29tZXMudHN2Lmd6IikKYGBgCgpgYGB7cn0KY2hvcmRvbWFfbG9zcyA8LSBmb2NhbF9jbl9kZiAlPiUgCiAgZmlsdGVyKGJpb3NwZWNpbWVuX2lkICVpbiUgY2hvcmRvbWFfc2FtcGxlcywgZ2VuZV9zeW1ib2wgPT0gIlNNQVJDQjEiKQoKY2hvcmRvbWFfbG9zcyAKYGBgCgpgYGB7cn0KI3dlIG5lZWQgdG8gaW5jbHVkZSB0aGUgc2FtcGxlX2lkIGZpZWxkIGZyb20gcGJ0YS1oaXN0b2xvZ2llcy50c3YgaW4gdGhlIGZpbmFsIHRhYmxlIChmaWVsZCB3aWxsIGFsbG93ICN1cyB0byBtYXAgYmV0d2VlbiBSTkEtc2VxIChlLmcuLCBTTUFSQ0IxIGV4cHJlc3Npb24gdmFsdWVzKSBhbmQgV0dTIGRhdGEgKGUuZy4sIFNNQVJDQjEgZm9jYWwgY29weSAjbnVtYmVyIHN0YXR1cykgZnJvbSB0aGUgc2FtZSBldmVudCBmb3IgYSBnaXZlbiBpbmRpdmlkdWFsKS4KI1RvIGdldCB0aGUgU01BUkNCMSBqaXR0ZXIgcGxvdCBpbiB0aGUgcGhvdG8gaGVyZSAjMjUwIChjb21tZW50KSwgeW91IHdpbGwgZmlyc3QgbmVlZCB0byByZWFkIGluIHRoZSAjY29sbGFwc2VkIGV4cHJlc3Npb24gZGF0YQoKZXhwcmVzc2lvbl9kYXRhIDwtIHJlYWRfcmRzKGZpbGUucGF0aCgiLi4iLCAiLi4iLCAiZGF0YSIsICJwYnRhLWdlbmUtZXhwcmVzc2lvbi1yc2VtLWZwa20tY29sbGFwc2VkLnN0cmFuZGVkLnJkcyIpKQpleHByZXNzaW9uX2RhdGEKYGBgCgpgYGB7cn0KY2hvcmRvbWFfaWRfZGYgPC0gaGlzdG9sb2dpZXNfZGYgJT4lIAogICMgb25seSByb3dzIHdpdGggY2hvcmRvbWEgc2FtcGxlcwogIGZpbHRlcihzaG9ydF9oaXN0b2xvZ3kgPT0gIkNob3Jkb21hIikgJT4lCiAgIyBzZWxlY3Qgb25seSB0aGVzZSBjb2x1bW5zIHRoYXQgd2UnbGwgbmVlZCBsYXRlcgogIHNlbGVjdChLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELCBzYW1wbGVfaWQsIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsCiAgICAgICAgIGV4cGVyaW1lbnRhbF9zdHJhdGVneSkKY2hvcmRvbWFfaWRfZGYKYGBgCgpgYGB7cn0KY29weV9uZXV0cmFsX2RmIDwtIGNob3Jkb21hX2lkX2RmICU+JSAKICAjIHRoZSBjb3B5IGV2ZW50cyBjYW4gb25seSBiZSB0YWtlbiBmcm9tIFdHUyBkYXRhIG5vdCBSTkEtc2VxIGRhdGEKICAjIHdlIGFsc28gb25seSB3YW50IGJpb3NwZWNpbWVucyB3aGVyZSBhIGxvc3Mgd2FzIG5vdCByZWNvcmRlZCB0byBhdm9pZCBkdXBsaWNhdGVzCiAgZmlsdGVyKGV4cGVyaW1lbnRhbF9zdHJhdGVneSA9PSAiV0dTIiwKICAgICAgICAgIShLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEICVpbiUgY2hvcmRvbWFfbG9zcyRiaW9zcGVjaW1lbl9pZCkpICU+JQogICMgaWYgdGhlcmUncyBubyBsb3NzLCBsZXQncyBhc3N1bWUgc3RhdHVzIGlzIGNvcHkgbmV1dHJhbAogIG11dGF0ZShzdGF0dXMgPSAibmV1dHJhbCIpICU+JQogICMgbGV0J3MgZ2V0IHRoZSBjb2x1bW5zIHRvIG1hdGNoIGNob3Jkb21hX2xvc3MKICByZW5hbWUoYmlvc3BlY2ltZW5faWQgPSBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEKSAlPiUKICBzZWxlY3QoYmlvc3BlY2ltZW5faWQsIHN0YXR1cykKY29weV9uZXV0cmFsX2RmCmBgYAoKYGBge3J9CmNob3Jkb21hX2NvcHkgPC0gY2hvcmRvbWFfbG9zcyAlPiUgCiAgI2pvaW4gdGhlIGxvc3NlcyB3aXRoIHRoZSBuZXV0cmFscyB0byBnZXQgYSBuZXcgZGF0YSBmcmFtZQogIHNlbGVjdChiaW9zcGVjaW1lbl9pZCwgc3RhdHVzKSAlPiUKICBiaW5kX3Jvd3MoY29weV9uZXV0cmFsX2RmKQpjaG9yZG9tYV9jb3B5CmBgYApOZWVkIHRvIGdldCB0aGUgc2FtcGxlX2lkIHRoYXQgY29ycmVzcG9uZHMgdG8gYmlvc3BlY2ltZW5faWQgaW50byBjaG9yZG9tYV9jb3B5IHNvIHdlIGNhbiBtYXRjaCBXR1MgYW5kIFJOQS1zZXEgYmlvc3BlY2ltZW5zIGZyb20gdGhlIHNhbWUgZXZlbnQvc2FtcGxlOgpgYGB7cn0KY2hvcmRvbWFfY29weSA8LSBjaG9yZG9tYV9jb3B5ICU+JQogICMgZ2V0IG9ubHkgdGhlIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsIHNhbXBsZV9pZCBjb2x1bW5zIGZyb20gb3VyIGlkZW50aWZpZXIgZGF0YS5mcmFtZQogICMgdGhlbiB1c2UgYmlvc3BlY2ltZW4gSURzIHRvIGFkZCB0aGUgc2FtcGxlX2lkIGluZm8KICBpbm5lcl9qb2luKHNlbGVjdChjaG9yZG9tYV9pZF9kZiwKICAgICAgICAgICAgICAgICAgICBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELAogICAgICAgICAgICAgICAgICAgIHNhbXBsZV9pZCksCiAgICAgICAgICAgICBieSA9IGMoImJpb3NwZWNpbWVuX2lkIiA9ICJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikpCmNob3Jkb21hX2NvcHkKYGBgCmxvb2sgYXQgU01BUkNCMSBleHByZXNzaW9uIHZhbHVlcyBvbmx5IGluIGNob3Jkb21hCgpgYGB7cn0KIyBnZXQgdGhlIHJvdyB0aGF0IGNvbnRhaW5zIHRoZSBTTUFSQ0IxIHZhbHVlcwojIGdlbmUgc3ltYm9scyBhcmUgcm93bmFtZXMKc21hcmNiMV9leHByZXNzaW9uIDwtIGV4cHJlc3Npb25fZGF0YVt3aGljaChyb3duYW1lcyhleHByZXNzaW9uX2RhdGEpID09ICJTTUFSQ0IxIiksIF0KCiMgbm93IG9ubHkgdGhlIGNvbHVtbnMgY29ycmVzcG9uZCB0byBjaG9yZG9tYSBzYW1wbGVzCnNtYXJjYjFfZXhwcmVzc2lvbiA8LSBzbWFyY2IxX2V4cHJlc3Npb25bLCB3aGljaChjb2xuYW1lcyhleHByZXNzaW9uX2RhdGEpICVpbiUgY2hvcmRvbWFfc2FtcGxlcykgXQpzbWFyY2IxX2V4cHJlc3Npb24KYGBgCgpUaGUgc21hcmNiMV9leHByZXNzaW9uIGlzIGEgbm90IGEgZnJpZW5kbHkgZm9ybSBeXjsgVHJhbnNwb3NpbmcgbmVlZGVkOiAKYGBge3J9CiMgdHJhbnNwb3NlIHN1Y2ggdGhhdCBzYW1wbGVzIGFyZSByb3dzCnNtYXJjYjFfZXhwcmVzc2lvbiA8LSB0KHNtYXJjYjFfZXhwcmVzc2lvbikgJT4lCiAgIyBtYWtlIGEgZGF0YS5mcmFtZQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICAjIHdlIHdhbnQgdGhlIHJvd25hbWVzIHRoYXQgYXJlIGJpb3NwZWNpbWVuIGlkZW50aWZlcnMgYXMgdGhlaXIgb3duIGNvbHVtbiBjYWxsZWQgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRAogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikgJT4lCiAgIyBnaXZlIFNNQVJDQjEgY29sdW1uIGEgc2xpZ2h0bHkgYmV0dGVyIGNvbHVtbiBuYW1lCiAgcmVuYW1lKFNNQVJDQjFfZXhwcmVzc2lvbiA9IFNNQVJDQjEpCnNtYXJjYjFfZXhwcmVzc2lvbgpgYGAKVGhpcyBhbHNvIG5lZWRzIHNhbXBsZV9pZCB0byBhZGQgaXQgaW46CgpgYGB7cn0Kc21hcmNiMV9leHByZXNzaW9uIDwtIHNtYXJjYjFfZXhwcmVzc2lvbiAlPiUKICBpbm5lcl9qb2luKHNlbGVjdChjaG9yZG9tYV9pZF9kZiwKICAgICAgICAgICAgICAgICAgICBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELAogICAgICAgICAgICAgICAgICAgIHNhbXBsZV9pZCksCiAgICAgICAgICAgICBieSA9ICJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikKc21hcmNiMV9leHByZXNzaW9uCmBgYAoKYGBge3J9CmNob3Jkb21hX3NtYXJjYjFfZGYgPC0gc21hcmNiMV9leHByZXNzaW9uICU+JQogICMgYW55IG1pc3Npbmcgc2FtcGxlcyB3aWxsIGdldCBmaWxsZWQgd2l0aCBOQSB3aGVuIHVzaW5nIGEgZnVsbCBqb2luCiAgZnVsbF9qb2luKGNob3Jkb21hX2NvcHksIGJ5ID0gInNhbXBsZV9pZCIpCmNob3Jkb21hX3NtYXJjYjFfZGYKYGBgCgpgYGB7cn0KIyB0aGlzIHN0ZXAgYWRkcyBpbiB0aGUgcGFydGljaXBhbnQgaWRlbnRpZmllciAoc2FtcGxlX2lkIHRvIG1hdGNoIGJldHdlZW4gdGhlIHR3byBkYXRhLmZyYW1lKQpjaG9yZG9tYV9zbWFyY2IxX2RmIDwtIGNob3Jkb21hX3NtYXJjYjFfZGYgJT4lCiAgaW5uZXJfam9pbihkaXN0aW5jdChzZWxlY3QoY2hvcmRvbWFfaWRfZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCkpLAogICAgICAgICAgICAgYnkgPSAic2FtcGxlX2lkIikKCiMgY29tYmluaW5nIHRoZSB0d28gYmlvc3BlY2ltZW4gaWRlbnRpZmllcnMgdG8gYSBzaW5nbGUgY29sdW1uIChhbGwgYmlvc3BlY2ltZW4gSURzIGZvciBhIHNhbXBsIHNlcGFyYXRlZCBieSBhIGNvbW1hKQpjaG9yZG9tYV9zbWFyY2IxX2RmIDwtIGNob3Jkb21hX3NtYXJjYjFfZGYgJT4lCiAgbXV0YXRlKEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQgPSBpZl9lbHNlKAogICAgIyBvbmUgc2FtcGxlIGlzIG1pc3NpbmcgV0dTIGRhdGEsIHNvIGlmIHRoYXQncyB0cnVlIG9ubHkgaW5jbHVkZSBiaW9zcGVjaW1lbiBJRCBmcm9tIFJOQS1zZXEKICAgIGlzLm5hKGJpb3NwZWNpbWVuX2lkKSwKICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsCiAgICBwYXN0ZShLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELCBiaW9zcGVjaW1lbl9pZCwgc2VwID0gIiwgIikKICApKQpjaG9yZG9tYV9zbWFyY2IxX2RmCmBgYAoKYGBge3J9CmNob3Jkb21hX3NtYXJjYjFfZGYgPC0gY2hvcmRvbWFfc21hcmNiMV9kZiAlPiUKICBzZWxlY3QoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgCiAgICAgICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsIAogICAgICAgICBzYW1wbGVfaWQsCiAgICAgICAgIHN0YXR1cywKICAgICAgICAgU01BUkNCMV9leHByZXNzaW9uKSAlPiUKICAjICdzdGF0dXMnIGlzIHJlcGxhY2VkIGEgbW9yZSBkZXNjcmlwdGl2ZSBuYW1lCiAgcmVuYW1lKGZvY2FsX1NNQVJDQjFfc3RhdHVzID0gc3RhdHVzKQpjaG9yZG9tYV9zbWFyY2IxX2RmCmBgYAoKYGBge3J9CiMgdGhpcyBzcGVjaWZpZXMgdGhhdCB0aGlzIGlzIHRoZSBkYXRhIHdlIHdhbnQgdG8gcGxvdApjaG9yZG9tYV9zbWFyY2IxX2RmICU+JQogICMgZHJvcCB0aGUgc2FtcGxlIHRoYXQgZG9lc24ndCBoYXZlIFdHUyBkYXRhCiAgdGlkeXI6OmRyb3BfbmEoKSAlPiUKICAjIHRoaXMgc3RlcCBzcGVjaWZpZXMgd2hhdCBzaG91bGQgZ28gb24gdGhlIHgtIGFuZCB5LWF4ZXMKICBnZ3Bsb3QoYWVzKHggPSBmb2NhbF9TTUFSQ0IxX3N0YXR1cywKICAgICAgICAgICAgIHkgPSBTTUFSQ0IxX2V4cHJlc3Npb24pKSArCiAgIyB3ZSB3YW50IGEgaml0dGVyIHBsb3Qgd2hlcmUgdGhlIHBvaW50cyBhcmVuJ3QgdG9vIGZhciAKICAjIGFwYXJ0IHRoYXQncyB3aGF0IHdpZHRoIGRvZXMKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMSkgKwogICMgdGhpcyBpcyBwbG90dGluZyB0aGUgbWVkaWFuIGFzIGEgYmx1ZSBkaWFtb25kCiAgc3RhdF9zdW1tYXJ5KGZ1bi55ID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICBnZW9tID0gInBvaW50IiwgCiAgICAgICAgICAgICAgIHNpemUgPSAzLCAKICAgICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICBzaGFwZSA9IDE4KQpgYGAKCiMjIEJyYWNoeXVyeSAvIFQgLyBUQlhUIHByb3RlaW4gZXhwcmVzc2lvbgo=